package br.com.bean;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.ViewAccessScoped;
import org.primefaces.event.SelectEvent;

import br.com.domain.Domain;
import br.com.domain.Pessoa;
import br.com.exception.BeanException;
import br.com.exception.ServiceException;
import br.com.filter.PessoaFilter;
import br.com.service.GenericServiceImpl;
import br.com.service.PessoaService;
import br.com.util.DomainListDataModel;

@ViewAccessScoped
@Named
public class PessoaBean extends GenericBean{
	
	private static final long serialVersionUID = 1L;
	
	/**************************************************************************/
	/**                                ATRIBUTOS                             **/
	/**************************************************************************/
	
	@Inject /** Service **/	 
	private PessoaService pessoaService; 
	
	/** Objeto Principal do Bean **/
	private Pessoa pessoa = new Pessoa();	
	
	/** Lista Principal do Bean **/
	private DomainListDataModel listPessoa;
	
	/** Lista Principal do Bean **/
	private List<Pessoa> listPessoaSelecionados;
	
	/** Objeto de Filtro do Bean **/
	private PessoaFilter pessoaFilter = new PessoaFilter();	
	
	protected Boolean teste;
	
	
	/**************************************************************************/
	/**                                Mï¿½TODOS                               **/
	/**************************************************************************/
	
	/**
	 * ON LOAD PAGE 
	 * @return void
	 */
	public void loadPage() {
	}
	
	/**
	 * NOVO REGISTRO
	 * @return void
	 */
	public void novo()  {
		this.activeModoNovo();
		this.pessoa = new Pessoa();
		this.goPage("pagePessoaCad");
	}
	
	/**
	 * SALVAR REGISTRO
	 * @return void
	 */
	public void salvar()  {	
        try {
			this.salvar(this.pessoa);
			MessageBean.showInfoMessagePorChave("msg-info-inclusao-sucesso");
			this.goPage("pagePessoaList");
			
		} catch (BeanException e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
        
        
	}
	
	/**
	 * EDITAR REGISTRO
	 * @return void
	 */
	public void editar() {
		try {
			this.editar(this.pessoa);
			this.goPage("pagePessoaCad");
			
		} catch (BeanException e) {
			MessageBean.showAlertMessage(e.getMessage());
		}
	}
	
	/**
	 * EXCLUIR REGISTROS SELECIONADOS
	 * @return void
	 */
	public void excluir()  {
		try {
			this.excluir(this.listPessoaSelecionados);
		} catch (ServiceException e) {
			MessageBean.showErrorMessage(e.getMessage() );
		}
	}
	
	/**
	 * VISUALIZAR REGISTRO
	 * @return void
	 */
	public void visualizar()  {
		super.activeModoVisualizar();
		this.goPage("pagePessoaCad");
	}
	
	/**
	 * BUSCAR TODOS OS REGISTROS
	 * @return DomainListDataModel
	 */
	public DomainListDataModel buscarTodos()  {
		try {
			 this.listPessoa = this.buscarTodos(Pessoa.class);
		} catch (BeanException e) {
			MessageBean.showErrorMessage(e.getMessage());
		}
		return this.listPessoa;
	}
	
	/**
	 * BUSCAR DADOS POR FILTRO
	 * @return void
	 */
	public void buscarPorFiltro()  {
		try {
			this.listPessoa = buscarPorFiltro(this.pessoaFilter);
			
			if(listPessoa.size() <=0){
				MessageBean.showAlertMessage("Não existem pessoas cadastradas que atendam ao filtro da pesquisa.");
			}
		} catch (BeanException e) {
			MessageBean.showErrorMessage(e.getMessage());
		}
	}
	
	/**
	 * LINHA SELECIONADA
	 * @return void
	 */
	public void onRowSelect(SelectEvent  event) {
		this.pessoa = (Pessoa) event.getObject();
				
	}
	
	/**
	 * SAIR
	 * @return void
	 */
	public void sair() {
	   this.goPage("pagePessoaList");
	}
	
	/**************************************************************************/
	/**                      Mï¿½TODOS  COMPLEMENTEARES                        **/
	/**************************************************************************/
	
	 @PostConstruct	 
	 public void initBean() throws ServiceException{
	    this.buscarTodos();
	    System.out.println("Bem Pessoa Iniciado");
	 }
	 
	 @PreDestroy
	 public void finalizarBean(){
	    
	    System.out.println("Bean Pessoa Destruido");
	 }
		
	/**************************************************************************/
	/**                           GET's E SET's                              **/
	/**************************************************************************/
	 @Override
	 public void setGenericService(GenericServiceImpl genericService) {
		super.setGenericService(this.pessoaService);
	 }
	 
	 @Override
	 public GenericServiceImpl getGenericService() {
		return this.pessoaService;
	 }
	 
	 @Override
	 public DomainListDataModel getListDomain() {
		 return this.getListPessoa();
	 }

	 @Override
	 public List<? extends Domain> getListDomainSelecionados() {
		return this.listPessoaSelecionados;
	 }
	 
	 @Override
	 public void setListDomainSelecionados(
			 List<? extends Domain> listDomainSelecionados) {
		 this.listPessoaSelecionados = null;
	 }

	 @Override
	 public Boolean getIsButtonDeleteDisabled() {		
		 return this.desabilitarExclusao(this.listPessoa, this.listPessoaSelecionados);
	 }

	@Override
	public Domain getDomain() {
		return this.pessoa;
	}
	 
	 public Pessoa getPessoa() {
		 return pessoa;
	 }

	 public void setPessoa(Pessoa pessoa) {
		 this.pessoa = pessoa;
	 }

	 
	 public PessoaFilter getPessoaFilter() {
		 return pessoaFilter;
	 }

	 public void setPessoaFilter(PessoaFilter pessoaFilter) {
		 this.pessoaFilter = pessoaFilter;
	 }

	 public DomainListDataModel getListPessoa() {
		 return listPessoa;
	 }

	 public void setListPessoa(DomainListDataModel listPessoa) {
		 this.listPessoa = listPessoa;
	 }

	 public List<Pessoa> getListPessoaSelecionados() {
		 return listPessoaSelecionados;
	 }

	 public void setListPessoaSelecionados(List<Pessoa> listPessoaSelecionados) {
		 this.listPessoaSelecionados = listPessoaSelecionados;
	 }

	public PessoaService getPessoaService() {
		return pessoaService;
	}

	public void setPessoaService(PessoaService pessoaService) {
		this.pessoaService = pessoaService;
	}
	 
	
}
